package com.anntly.netty.firstDemo;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import java.util.concurrent.TimeUnit;

/**
 * @Auther: 张文
 * @Date: 2020/5/5 15:24
 * @Description: 1. 自定义Handler，实现 ChannelInboundHandlerAdapter
 *               2.
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    /**
     * @Description 读取客户端的数据
     * @Date 2020/5/5 15:26
     * @Param [ctx, msg] ctx:上下文对象，可以回去Pipeline、channel、地址等
     *                   msg:客户端发送的数据，默认为Object
     * @return void
     **/
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("server ctx:"+ctx);
        // 将msg转换为一个ByteBuf
//        ByteBuf buf = (ByteBuf) msg;
//        System.out.println("客户端:"+buf.toString(CharsetUtil.UTF_8));
//        System.out.println("客户端地址:"+ctx.channel().remoteAddress());
        // 将耗时任务放进队列中执行，由于是队列是按序执行
        ctx.channel().eventLoop().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                ByteBuf buf = (ByteBuf) msg;
                System.out.println("客户端:"+buf.toString(CharsetUtil.UTF_8));
                System.out.println("客户端地址:"+ctx.channel().remoteAddress());
            }
        });
        // 定时任务加入队列
        ctx.channel().eventLoop().schedule(new Runnable() {
            @Override
            public void run() {
                ByteBuf buf = (ByteBuf) msg;
                System.out.println("客户端:"+buf.toString(CharsetUtil.UTF_8));
                System.out.println("客户端地址:"+ctx.channel().remoteAddress());
            }
        },1,TimeUnit.SECONDS);
    }

    /**
     * @Description 数据读取完毕后的处理
     * @Date 2020/5/5 15:29
     * @Param [ctx]
     * @return void
     **/
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 将数据写入到缓存并刷新
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello client",CharsetUtil.UTF_8));
    }

    /**
     * @Description 处理异常，一般需要关闭通道
     * @Date 2020/5/5 15:31
     * @Param [ctx, cause]
     * @return void
     **/
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
